let url = 'http://www.domain.com/?user=anonymous&id[1]=123&id[0]=456&xx[0]=123&xx[1]=456&city=%E5%8C%97%E4%BA%AC&enabled';
// let url = 'http://www.domain.com/?user=anonymous&id=123&id=456&city=%E5%8C%97%E4%BA%AC&enabled';
parseParam(url)

//
/**结果
 { user: 'anonymous',
 id: [ 123, 456 ], // 重复出现的 key 要组装成数组，能被转成数字的就转成数字类型
 city: '北京', // 中文需解码
 enabled: true, // 未指定值得 key 约定为 true
 }
 */

// function parseParam(url) {
//     // let reg = /.+\?(.+)$/

//     // let regData = reg.exec(url);
//     //将 ? 后面的字符串捕获组拿到
//     // let paramsStr = regData[1]
//
//     let params = new URL(url).searchParams
//     let paramsObj = {};
//     console.log(params)
//     for (let [key, value] of params) {
//         if (!isNaN(value)) {
//             value = Number(value)
//         }
//         if (paramsObj.hasOwnProperty(key)) {
//             paramsObj[key] = [].concat(paramsObj[key], value)
//         } else {
//             paramsObj[key] = value
//         }
//     }
//     for (const paramsObjKey in paramsObj) {
//         console.log(paramsObjKey,'paramsObj[paramsObjKey]')
//         if (paramsObj[paramsObjKey] === 0){
//             paramsObj[paramsObjKey] = true
//         }
//     }
//     console.log(paramsObj)
//     return paramsObj
// }

function parseParam(url) {
    let params = new URL(url).searchParams;
    let paramsObj = {};
    for (let [key, value] of params) {
        // 转换数字
        if (!isNaN(value) && value !== '') {
            value = Number(value);
        }
        if (value === '') {
            value = true
        }
        // 处理数组键
        //exec() 方法在一个指定字符串中执行一个搜索匹配。 如果匹配失败 返回null 将正则表达式的 lastIndex 重置为 0
        //如果匹配成功，exec() 方法返回一个数组，并更新正则表达式对象的 lastIndex 属性。完全匹配成功的文本将作为返回数组的第一项，从第二项起，后续每项都对应一个匹配的捕获组。
        let arrayKeyMatch = key.match(/(.+)\[(\d+)]/);
        /**
         * arrayKeyMatch[1]是第一个捕获组的值 arrayKeyMatch[2] 第二个捕获组的值
         * [ 'id[0]', 'id', '0', index: 0, input: 'id[0]', groups: undefined ]
         */
        if (arrayKeyMatch) {
            //拿到数组对应的名称
            let arrayKey = arrayKeyMatch[1];
            let index = parseInt(arrayKeyMatch[2], 10);
            if (!paramsObj.hasOwnProperty(arrayKey)) {
                paramsObj[arrayKey] = [];
            }
            // 确保数组有足够的长度
            // if (paramsObj[arrayKey].length <= index) {
            //     paramsObj[arrayKey].length = index + 1;
            // }
            paramsObj[arrayKey][index] = value;

        } else {
            paramsObj[key] = value;
        }
    }

    console.log(paramsObj);
    return paramsObj;
}